home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr25 / memsz130.zip / OBJECT.C < prev    next >
C/C++ Source or Header  |  1993-03-14  |  14KB  |  415 lines

  1. /*************************************************************** OBJECT.C
  2.  *                                                                      *
  3.  *                    Object Processor Definitions                      *
  4.  *                                                                      *
  5.  ************************************************************************/
  6.  
  7. #define INCL_WIN
  8. #define INCL_GPI
  9. #include <os2.h>
  10. #include <stdlib.h>
  11.  
  12. #include "object.h"
  13.  
  14. #define TRUE  1
  15. #define FALSE 0
  16.  
  17. #define NOT !
  18. #define OR  ||
  19. #define AND &&
  20.  
  21.  
  22. /************************************************************************
  23.  *                                                                      *
  24.  *      Initialize PM Environment at program start                      *
  25.  *                                                                      *
  26.  ************************************************************************/
  27.  
  28. VOID Object
  29. (
  30.   HAB *phAB,
  31.   HMQ *phMQ,
  32.   ULONG flStyle,
  33.   HELPINIT *pHelpInit,
  34.   HWND *phwndHelp,
  35.   HWND hwndOwner,
  36.   SHORT idWindow,
  37.   PCLASS pClass,
  38.   PCHAR pszTitle
  39. )
  40. {
  41.  /***********************************************************************
  42.   *                     Local Declarations                              *
  43.   ***********************************************************************/
  44.  
  45.   HAB hAB ;
  46.   HMQ hMQ ;
  47.   HWND hwnd ;
  48.  
  49.  /***********************************************************************
  50.   * Initialize environment.                                             *
  51.   ***********************************************************************/
  52.  
  53.   ObjInitialize
  54.   (
  55.     phAB ? phAB : &hAB,
  56.     phMQ ? phMQ : &hMQ,
  57.     flStyle,
  58.     pHelpInit,
  59.     phwndHelp
  60.   ) ;
  61.  
  62.  /***********************************************************************
  63.   * Create the object.                            *
  64.   ***********************************************************************/
  65.  
  66.   hwnd = ObjCreateObject ( hwndOwner, idWindow,
  67.     pClass, pszTitle, *phwndHelp ) ;
  68.  
  69.  /***********************************************************************
  70.   * Go execute the object.  Destroy it and clean up when done.          *
  71.   ***********************************************************************/
  72.  
  73.   ObjExecuteAll ( phAB ? *phAB : hAB ) ;
  74.  
  75.   ObjDestroy ( hwnd ) ;
  76.  
  77.   ObjCleanup ( phAB ? *phAB : hAB, phMQ ? *phMQ : hMQ, *phwndHelp ) ;
  78. }
  79.  
  80. /************************************************************************
  81.  *                                                                      *
  82.  *      Initialize PM Environment at program start                      *
  83.  *                                                                      *
  84.  ************************************************************************/
  85.  
  86. VOID ObjInitialize
  87. (
  88.   HAB *phAB,
  89.   HMQ *phMQ,
  90.   ULONG flStyle,
  91.   HELPINIT *pHelpInit,
  92.   HWND *phwndHelp
  93. )
  94. {
  95.  /***********************************************************************
  96.   * Initialize PM mode and create the application message queue.        *
  97.   ***********************************************************************/
  98.  
  99.   *phAB = WinInitialize ( 0 ) ;
  100.   *phMQ = WinCreateMsgQueue ( *phAB, 0 ) ;
  101.  
  102.  /***********************************************************************
  103.   * Register the general object class.                                  *
  104.   ***********************************************************************/
  105.  
  106.   WinRegisterClass
  107.   (
  108.     *phAB,
  109.     CLASS_OBJECT,
  110.     ObjMessageProcessor,
  111.     flStyle,
  112.     sizeof(PVOID)
  113.   ) ;
  114.  
  115.  /***********************************************************************
  116.   * If help instance to be set up, do it.                *
  117.   ***********************************************************************/
  118.  
  119.   if ( pHelpInit )
  120.   {
  121.     *phwndHelp = WinCreateHelpInstance ( *phAB, pHelpInit ) ;
  122.  
  123.     if ( *phwndHelp == NULL )
  124.     {
  125.       WinMessageBox ( HWND_DESKTOP, HWND_DESKTOP,
  126.     "ERROR: Unable to create help instance.",
  127.     "Window", 0, MB_ENTER ) ;
  128.     }
  129.   }
  130. }
  131.  
  132. /************************************************************************
  133.  *                                                                      *
  134.  *      Create an Object                                                *
  135.  *                                                                      *
  136.  ************************************************************************/
  137.  
  138. HWND ObjCreateObject
  139. (
  140.   HWND hwndOwner,
  141.   SHORT idWindow,
  142.   PCLASS pClass,
  143.   PCHAR szTitle,
  144.   HWND hwndHelp
  145. )
  146. {
  147.  /***********************************************************************
  148.   *                     Local Declarations                              *
  149.   ***********************************************************************/
  150.  
  151.   FRAMECDATA fcdata ;
  152.   HWND hwndClient ;
  153.   HWND hwndFrame = hwndOwner ;
  154.  
  155.  /***********************************************************************
  156.   * If called for, create a frame window.  Return if unable to do so.   *
  157.   ***********************************************************************/
  158.  
  159.   if ( pClass->fFrame )
  160.   {
  161.     fcdata.cb = sizeof(fcdata) ;
  162.     fcdata.flCreateFlags = pClass->FrameData.flCreateFlags ;
  163.     fcdata.hmodResources = pClass->FrameData.hmodResources ;
  164.     fcdata.idResources     = pClass->FrameData.idResources ;
  165.  
  166.     hwndFrame = WinCreateWindow ( hwndOwner, WC_FRAME, "",
  167.       pClass->FrameData.flStyle, 0, 0, 0, 0, hwndOwner, HWND_TOP,
  168.       idWindow, &fcdata, NULL ) ;
  169.  
  170.     if ( hwndFrame == NULL )
  171.     {
  172.       return ( NULL ) ;
  173.     }
  174.  
  175.     hwndOwner = hwndFrame ;
  176.     idWindow = FID_CLIENT ;
  177.  
  178.     if ( szTitle )
  179.     {
  180.       WinSetWindowText ( pClass->fFrame ? hwndFrame : hwndClient, szTitle ) ;
  181.     }
  182.   }
  183.  
  184.  /***********************************************************************
  185.   * Create client window.  If this fails, destroy frame and return.     *
  186.   ***********************************************************************/
  187.  
  188.   hwndClient = WinCreateWindow ( hwndOwner, CLASS_OBJECT, "",
  189.     pClass->flStyle, 0, 0, 0, 0, hwndOwner, HWND_BOTTOM,
  190.     idWindow, pClass, NULL ) ;
  191.  
  192.   if ( hwndClient == NULL )
  193.   {
  194.     if ( pClass->fFrame )
  195.     {
  196.       WinDestroyWindow ( hwndFrame ) ;
  197.     }
  198.     return ( NULL ) ;
  199.   }
  200.  
  201.  /***********************************************************************
  202.   * Associate the help instance with the frame window.            *
  203.   ***********************************************************************/
  204.  
  205.   WinSetWindowUShort ( pClass->fFrame ? hwndFrame : hwndClient, QWS_ID, idWindow ) ;
  206.   if ( hwndHelp )
  207.   {
  208.     WinAssociateHelpInstance ( hwndHelp, pClass->fFrame ? hwndFrame : hwndClient ) ;
  209.   }
  210.  
  211.  /***********************************************************************
  212.   * Return handle to frame.                                             *
  213.   ***********************************************************************/
  214.  
  215.   return ( pClass->fFrame ? hwndFrame : hwndClient ) ;
  216. }
  217.  
  218. /************************************************************************
  219.  *                                                                      *
  220.  *      Execute all Objects                                             *
  221.  *                                                                      *
  222.  ************************************************************************/
  223.  
  224. VOID ObjExecuteAll ( HAB hAB )
  225. {
  226.  /***********************************************************************
  227.   *                     Local Declarations                              *
  228.   ***********************************************************************/
  229.  
  230.   QMSG qmsg ;
  231.  
  232.  /***********************************************************************
  233.   * Wait for and process messages to the window's queue.  Terminate     *
  234.   *   when the WM_QUIT message is received.                             *
  235.   ***********************************************************************/
  236.  
  237.   while ( WinGetMsg ( hAB, &qmsg, NULL, 0, 0 ) )
  238.   {
  239.     WinDispatchMsg ( hAB, &qmsg ) ;
  240.   }
  241. }
  242.  
  243. /************************************************************************
  244.  *                                                                      *
  245.  *      Destroy a generalized Object                                    *
  246.  *                                                                      *
  247.  ************************************************************************/
  248.  
  249. VOID ObjDestroy ( HWND hwnd )
  250. {
  251.  /***********************************************************************
  252.   * Destroy window.                                                     *
  253.   ***********************************************************************/
  254.  
  255.   WinDestroyWindow ( hwnd ) ;
  256. }
  257.  
  258. /************************************************************************
  259.  *                                                                      *
  260.  *      Clean up PM Environment prior to program completion.            *
  261.  *                                                                      *
  262.  ************************************************************************/
  263.  
  264. VOID ObjCleanup ( HAB hAB, HMQ hMQ, HWND hwndHelp )
  265. {
  266.  /***********************************************************************
  267.   * If help instance has been created, get rid of it.            *
  268.   ***********************************************************************/
  269.  
  270.   if ( hwndHelp )
  271.   {
  272.     WinDestroyHelpInstance ( hwndHelp ) ;
  273.   }
  274.  
  275.  /***********************************************************************
  276.   * Discard all that was requested of the system and terminate.         *
  277.   ***********************************************************************/
  278.  
  279.   WinDestroyMsgQueue ( hMQ ) ;
  280.   WinTerminate ( hAB ) ;
  281. }
  282.  
  283. /************************************************************************
  284.  *                                                                      *
  285.  *      General Object Procedure - Process messages to object           *
  286.  *                                                                      *
  287.  ************************************************************************/
  288.  
  289. MRESULT EXPENTRY ObjMessageProcessor
  290. (
  291.   HWND hwnd,
  292.   USHORT msg,
  293.   MPARAM mp1,
  294.   MPARAM mp2
  295. )
  296. {
  297.  /***********************************************************************
  298.   *                             Declarations                            *
  299.   ***********************************************************************/
  300.  
  301.   USHORT cNumberLeft ;
  302.   MRESULT mr ;
  303.   PCLASS pClass ;
  304.   PVOID pData ;
  305.   PMETHOD pMethod ;
  306.   POBJECT pObject ;
  307.   SEL selData ;
  308.   SEL selObject ;
  309.  
  310.  /***********************************************************************
  311.   * Perform pre-processing of WM_CREATE message.                        *
  312.   ***********************************************************************/
  313.  
  314.   if ( msg == WM_CREATE )
  315.   {
  316.     pClass = (PCLASS) PVOIDFROMMP ( mp1 ) ;
  317.     DosAllocSeg ( sizeof(OBJECT), &selObject, SEG_NONSHARED ) ;
  318.     DosAllocSeg ( pClass->cDataSize, &selData, SEG_NONSHARED ) ;
  319.     pObject = MAKEP ( selObject, 0 ) ;
  320.     pObject->selObject = selObject ;
  321.     pObject->selData = selData ;
  322.     pObject->pClass = pClass ;
  323.     WinSetWindowPtr ( hwnd, 0, pObject ) ;
  324.   }
  325.  
  326.  /***********************************************************************
  327.   * Get object's class information and private data pointer.            *
  328.   ***********************************************************************/
  329.  
  330.   pObject = (POBJECT) WinQueryWindowPtr ( hwnd, 0 ) ;
  331.   pData = MAKEP ( pObject->selData, 0 ) ;
  332.   pClass = pObject->pClass ;
  333.  
  334.  /***********************************************************************
  335.   * Process messages according to object's class method table.          *
  336.   ***********************************************************************/
  337.  
  338.   pMethod = pClass->pMethods ;
  339.   cNumberLeft = pClass->cMethods ;
  340.   while ( ( cNumberLeft ) AND ( pMethod->Action != msg ) )
  341.   {
  342.     pMethod ++ ;
  343.     cNumberLeft -- ;
  344.   }
  345.  
  346.   if ( cNumberLeft )
  347.   {
  348.     mr = pMethod->pFunction ( hwnd, msg, mp1, mp2, pData ) ;
  349.   }
  350.   else
  351.   {
  352.     mr = pClass->BaseObjectProcessor ( hwnd, msg, mp1, mp2 ) ;
  353.   }
  354.  
  355.  /***********************************************************************
  356.   * Perform post-processing of WM_DESTROY message.                      *
  357.   ***********************************************************************/
  358.  
  359.   if ( msg == WM_DESTROY )
  360.   {
  361.     DosFreeSeg ( pObject->selData ) ;
  362.     DosFreeSeg ( pObject->selObject ) ;
  363.   }
  364.  
  365.  /***********************************************************************
  366.   * Return result from message processor.                               *
  367.   ***********************************************************************/
  368.  
  369.   return ( mr ) ;
  370. }
  371.  
  372. /************************************************************************
  373.  *                                                                      *
  374.  *      Generalized Message Processor                                   *
  375.  *                                                                      *
  376.  ************************************************************************/
  377.  
  378. MRESULT EXPENTRY GeneralMessageProcessor
  379.   HWND hwnd, 
  380.   USHORT msg, 
  381.   MPARAM mp1, 
  382.   MPARAM mp2,
  383.   PMETHOD pMethods,
  384.   SHORT cMethods,
  385.   MRESULT (EXPENTRY *pDefaultMessageProcessor) (HWND,USHORT,MPARAM,MPARAM),
  386.   PVOID pData
  387. )
  388. {
  389.  /***********************************************************************
  390.   * Search class method table for message to be processed.              *
  391.   ***********************************************************************/
  392.  
  393.   while ( ( cMethods ) AND ( pMethods->Action != msg ) )
  394.   {
  395.     pMethods ++ ;
  396.     cMethods -- ;
  397.   }
  398.  
  399.  /***********************************************************************
  400.   * If message was found, return through specified processing function. *
  401.   ***********************************************************************/
  402.  
  403.   if ( cMethods )
  404.   {
  405.     return ( pMethods->pFunction ( hwnd, msg, mp1, mp2, pData ) ) ;
  406.   }
  407.  
  408.  /***********************************************************************
  409.   * If not, return through the default message processing function.     *
  410.   ***********************************************************************/
  411.  
  412.   return ( pDefaultMessageProcessor ( hwnd, msg, mp1, mp2 ) ) ;
  413. }
  414.